#ifndef xpack_macro_xdebug
#define xpack_macro_xdebug
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::macro_xdebug::inc
#include"configure/switch.hpp"
#include"macro/private/log.hpp"
#include"macro/xlink.hpp"
#include"macro/xwarning.hpp"
#pragma pop_macro("xuser")

/*
作用:
按需输出调试信息(更改配置后记得重新编译)

在 configure/switch.hpp __mixc_debug_tag 枚举中控制配置项
比如我们在新增输出点

// file:configure/switch.hpp
enum __mixc_debug_tag : int{
    ...
    ...
    ...


    // 追加
    // 推荐使用包含范式的命名规则
    // 以 im_ 开头后面模块路径

    // xon 后边的表示启用
    xon,
        im_path_to_your_module_function_0,

    // xoff 后边的表示关闭
    xoff,
        im_path_to_your_module_function_1,
};


// file:path/to/your/module.hpp

#include"macro/xdebug.hpp"

struct module{
    void function_0(){
        ...
        ...
        ...

        int var0 = ...;
        bool var1 = ...;

        // 由于 im_path_to_your_module_function_0 处于 __mixc_debug_tag [xon] 后边，
        // 表示程序运行到此处时 [需要] 输出此调式信息
        xdebug(im_path_to_your_module_function_0, var0, var1);
    }

    void function_1(){
        ...
        ...
        ...

        int var0 = ...;
        bool var1 = ...;

        // 由于 im_path_to_your_module_function_1 处于 __mixc_debug_tag [xoff] 后边，
        // 表示程序运行到此处时 [无需] 输出此调式信息
        xdebug(im_path_to_your_module_function_0, var0, var1);
    }
};

*/

#if xuse_xdebug
    #define xdebug(TOKEN,...)                               \
    if (TOKEN > 0 and ([&](asciis func){                    \
        using namespace ::mixc::macro_private_log::origin;  \
        log(                                                \
            for_debug, __FILE__, __LINE__,                  \
            func, #__VA_ARGS__, normal, __VA_ARGS__);       \
        return true;                                        \
    })(__func__))

    xwarning_disable(4390)
#else
    #define xdebug(...)     if constexpr (false)
#endif
#endif
